﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Serialization;

namespace Mighty.Common
{
    /// <summary>
    /// 플레이어가 발생시킬 수 있는 최상위 Exception. 
    /// </summary>
    public class ConnectorException : Exception
    {
        public ActualStatus status;                         // 진행상태
        public int position;                                // 플레이어위치

        public String whoscat;                              // 어떤문제
        public String footprint;                            // 문제객체

        public ConnectorException(ActualStatus s, int p)
        {
            status = s;
            position = p;
        }

        public ConnectorException(ActualStatus s, int p, String t, Object o)
        {
            status = s;
            position = p;
            whoscat = t;

            if (o != null)
            {
                XmlSerializer ser = new XmlSerializer(o.GetType());
                TextWriter writer = new StringWriter();
                ser.Serialize(writer, o);
                footprint = writer.ToString();
                writer.Close();
            }
        }
    }

    /// <summary>
    /// 플레이어가 잘못된 게임액션을 취했을 경우 발생. 가지고 있지 않은 카드를 낸다거나 이미 사용한 카드를 다시 
    /// 사용하려고 할때 발생한다
    /// </summary>
    public class InvalidActionException : ConnectorException
    {
        public InvalidActionException(ActualStatus s, int p)
            : base(s, p)
        {
        }

        public InvalidActionException(ActualStatus s, int p, String t, Object o)
            : base(s, p, t, o)
        {
        }
    }

    /// <summary>
    /// 플레이어가 제한된 시간안에 카드를 내지 못할경우 발생
    /// </summary>
    public class TicTimeOutException : ConnectorException
    {
        public TicTimeOutException(ActualStatus s, int p)
            : base(s, p)
        {

        }
    }

    /// <summary>
    /// 인공지능 플레이어가 발생시키는 예외
    /// </summary>
    public class AIConnectorException : ConnectorException
    {
        public AIConnectorException(ActualStatus s, int p)
            : base(s, p)
        {
        }
    }

    /// <summary>
    /// 게임 플레이어가 발생시키는 예외
    /// </summary>
    public class PlayerConnectorException : ConnectorException
    {
        public PlayerConnectorException(ActualStatus s, int p)
            : base(s, p)
        {
        }
    }

}
